/*
 * @Author: GL
 * @Date: 2022-09-18 11:32:34
 * @LastEditors: GL
 * @LastEditTime: 2023-04-05 02:08:32
 * @Description: 用户数据的处理
 */

// 导入数据库操作模块
const db = require("../db/index")
// 导入密码加密模块
const bcrypt = require("bcryptjs")
// 导入token模块
const jwt = require("jsonwebtoken")
// 导入密钥
const secretKey = require('./config')
// 导入服务端请求模块
var request = require('superagent');
const { response } = require("express");

// 用户注册
exports.register = (req, res) => {

  const userinfo = req.body
  console.log('ll');

  const namesql = 'select * from users where name=? and is_del=0'
  db.query(namesql, [userinfo.name], (err, result) => {
    if (err) {
      return res.send({
        status: 1,
        msg: 'sql语句执行失败'
      })
    }
    // 判断用户名是否被占用
    if (result.length > 0) {
      return res.send({
        status: 1,
        msg: '用户名被占用'
      })
    }

    // 调用bcryptjs对密码进行加密
    userinfo.passwd = bcrypt.hashSync(userinfo.passwd, 10)

    const useradd = 'insert into users set ?'
    db.query(useradd, { name: userinfo.name, passwd: userinfo.passwd, sex: userinfo.sex, phone: userinfo.phone }, (err, result) => {
      if (err) { return res.send({ msg: err }) }
      // 判断影响行数是否为一行
      if (result.affectedRows !== 1) {
        return res.send({ status: 1, msg: '注册用户失败，请稍后再试！' })
      }
      res.send({ status: 0, msg: '注册成功！' })
    })
  })
}

// 用户账号密码登录
exports.login = (req, res) => {
  const userinfo = req.body
  // 进行数据比对
  const sql = 'select * from users where name=? and is_del=0'
  db.query(sql, userinfo.name, function (err, results) {
    // 执行 SQL 语句失败
    if (err) return res.send(err)
    // 执行 SQL 语句成功，但是查询到数据条数不等于 1
    if (results.length !== 1) return res.send({
      status: 1,
      message: '用户或密码错误',
    })
    // TODO：判断用户输入的登录密码是否和数据库中的密码一致
    // 核心实现思路：调用 bcrypt.compareSync(用户提交的密码, 数据库中的密码) 方法比较密码是否一致
    const compareResult = bcrypt.compareSync(userinfo.passwd, results[0].passwd)

    // 如果对比的结果等于 false, 则证明用户输入的密码错误
    if (!compareResult) {
      return res.cc('登录失败！')
    }

    // 核心注意点：在生成 Token 字符串的时候，一定要剔除 密码 和 头像 的值
    const user = { ...results[0], passwd: '', pic: '' }

    const token = jwt.sign(user, secretKey.jwtSecretKey, { expiresIn: secretKey.trem })
    res.send({
      status: 0,
      msg: '登录成功！',
      // 为了方便客户端使用 Token，在服务器端直接拼接上 Bearer 的前缀
      token: 'Bearer ' + token
    })
  })
}

// 微信登录获取openid
exports.code = (req, res) => {
  // 服务端发起请求获取用户openid等信息
  // 此处的小程序信息来自好麦司机端小程序
  request
    .get('https://api.weixin.qq.com/sns/jscode2session')
    .query({
      appid: '小程序appid',
      secret: '小程序key',
      js_code: req.query.code,
      grant_type: 'authorization_code'
    })
    .then(response => {
      res.cc(response.text, 0)
    });
}

// 获取手机号
exports.getPhone = (req, res) => {

  request
    .get('https://api.weixin.qq.com/cgi-bin/token')
    .query({
      grant_type: 'client_credential',
      appid: '小程序appid',
      secret: '小程序key'
    })
    .then(e => {
      console.log(e.body.access_token)
      // 服务端发起请求
      request
        .post('https://api.weixin.qq.com/wxa/business/getuserphonenumber')
        .query({
          access_token: e.body.access_token
        })
        .send({
          'code': req.body.code
        })
        .then(response => {
          console.log(response.body.phone_info)
          res.send('登录成功')
        })
    })
}

